package com.joker.demo.core.domain.dto;

import lombok.Data;

import java.io.Serializable;
import java.util.List;

/**
 * 环境监控数据DTO
 *
 * @author : feixiang.li
 * @since : 2025-01-27 10:30
 */
@Data
public class EnvironmentMonitorDTO implements Serializable {

    /**
     * 执行器注册键
     */
    private String registerKey;

    /**
     * 应用名称
     */
    private String appName;

    /**
     * 监控时间戳
     */
    private Long timestamp;

    /**
     * 系统信息
     */
    private SystemInfo systemInfo;

    /**
     * JVM信息
     */
    private JvmInfo jvmInfo;

    /**
     * 磁盘信息列表
     */
    private List<DiskInfo> diskInfos;

    /**
     * 网络信息
     */
    private NetworkInfo networkInfo;

    /**
     * 进程信息
     */
    private ProcessInfo processInfo;

    /**
     * 系统信息
     */
    @Data
    public static class SystemInfo implements Serializable {
        /**
         * 操作系统名称
         */
        private String osName;

        /**
         * 操作系统版本
         */
        private String osVersion;

        /**
         * 系统架构
         */
        private String osArch;

        /**
         * CPU核心数
         */
        private Integer cpuCores;

        /**
         * CPU使用率
         */
        private Double cpuUsagePercent;

        /**
         * 系统总内存(MB)
         */
        private Long totalMemoryMB;

        /**
         * 系统已用内存(MB)
         */
        private Long usedMemoryMB;

        /**
         * 系统空闲内存(MB)
         */
        private Long freeMemoryMB;

        /**
         * 系统内存使用率
         */
        private Double systemMemoryUsagePercent;

        /**
         * 系统负载平均值
         */
        private Double systemLoadAverage;

        /**
         * 系统运行时间(秒)
         */
        private Long uptimeSeconds;
    }

    /**
     * JVM信息
     */
    @Data
    public static class JvmInfo implements Serializable {
        /**
         * JVM版本
         */
        private String jvmVersion;

        /**
         * JVM供应商
         */
        private String jvmVendor;

        /**
         * JVM名称
         */
        private String jvmName;

        /**
         * JVM启动时间
         */
        private Long startTime;

        /**
         * JVM运行时间(毫秒)
         */
        private Long uptime;

        /**
         * 最大堆内存(MB)
         */
        private Long maxHeapMemoryMB;

        /**
         * 已用堆内存(MB)
         */
        private Long usedHeapMemoryMB;

        /**
         * 空闲堆内存(MB)
         */
        private Long freeHeapMemoryMB;

        /**
         * 堆内存使用率
         */
        private Double heapMemoryUsagePercent;

        /**
         * 最大非堆内存(MB)
         */
        private Long maxNonHeapMemoryMB;

        /**
         * 已用非堆内存(MB)
         */
        private Long usedNonHeapMemoryMB;

        /**
         * 非堆内存使用率
         */
        private Double nonHeapMemoryUsagePercent;

        /**
         * 线程总数
         */
        private Integer threadCount;

        /**
         * 守护线程数
         */
        private Integer daemonThreadCount;

        /**
         * 峰值线程数
         */
        private Integer peakThreadCount;

        /**
         * 类加载器数量
         */
        private Integer classLoaderCount;

        /**
         * 已加载类数量
         */
        private Long loadedClassCount;

        /**
         * 总加载类数量
         */
        private Long totalLoadedClassCount;

        /**
         * 已卸载类数量
         */
        private Long unloadedClassCount;

        /**
         * GC信息列表
         */
        private List<GcInfo> gcInfos;
    }

    /**
     * GC信息
     */
    @Data
    public static class GcInfo implements Serializable {
        /**
         * GC名称
         */
        private String gcName;

        /**
         * GC类型
         */
        private String gcType;

        /**
         * GC次数
         */
        private Long collectionCount;

        /**
         * GC总时间(毫秒)
         */
        private Long collectionTime;

        /**
         * 平均GC时间(毫秒)
         */
        private Double averageCollectionTime;
    }

    /**
     * 磁盘信息
     */
    @Data
    public static class DiskInfo implements Serializable {
        /**
         * 磁盘名称
         */
        private String diskName;

        /**
         * 磁盘路径
         */
        private String diskPath;

        /**
         * 总空间(MB)
         */
        private Long totalSpaceMB;

        /**
         * 已用空间(MB)
         */
        private Long usedSpaceMB;

        /**
         * 可用空间(MB)
         */
        private Long freeSpaceMB;

        /**
         * 磁盘使用率
         */
        private Double diskUsagePercent;

        /**
         * 文件系统类型
         */
        private String fileSystemType;
    }

    /**
     * 网络信息
     */
    @Data
    public static class NetworkInfo implements Serializable {
        /**
         * 网络接口列表
         */
        private List<NetworkInterfaceInfo> networkInterfaces;

        /**
         * 总接收字节数
         */
        private Long totalBytesReceived;

        /**
         * 总发送字节数
         */
        private Long totalBytesSent;

        /**
         * 总接收包数
         */
        private Long totalPacketsReceived;

        /**
         * 总发送包数
         */
        private Long totalPacketsSent;
    }

    /**
     * 网络接口信息
     */
    @Data
    public static class NetworkInterfaceInfo implements Serializable {
        /**
         * 接口名称
         */
        private String interfaceName;

        /**
         * 接口显示名称
         */
        private String displayName;

        /**
         * MAC地址
         */
        private String macAddress;

        /**
         * IP地址列表
         */
        private List<String> ipAddresses;

        /**
         * 是否启用
         */
        private Boolean isUp;

        /**
         * 是否回环接口
         */
        private Boolean isLoopback;

        /**
         * 接收字节数
         */
        private Long bytesReceived;

        /**
         * 发送字节数
         */
        private Long bytesSent;

        /**
         * 接收包数
         */
        private Long packetsReceived;

        /**
         * 发送包数
         */
        private Long packetsSent;
    }

    /**
     * 进程信息
     */
    @Data
    public static class ProcessInfo implements Serializable {
        /**
         * 进程ID
         */
        private Long pid;

        /**
         * 进程名称
         */
        private String processName;

        /**
         * 进程CPU使用率
         */
        private Double processCpuUsagePercent;

        /**
         * 进程内存使用(MB)
         */
        private Long processMemoryUsageMB;

        /**
         * 进程线程数
         */
        private Integer processThreadCount;

        /**
         * 进程打开文件数
         */
        private Long openFileCount;

        /**
         * 进程优先级
         */
        private Integer priority;
    }
}
